package com.axiang.lib_common.network;

import androidx.annotation.NonNull;

import com.axiang.lib_api.http.throwable.ExceptionHandle;
import com.axiang.lib_api.http.throwable.ResponseThrowable;
import com.axiang.lib_api.response.BaseResponse;
import com.axiang.lib_common.mvvm.model.BaseModel;
import com.axiang.lib_common.mvvm.viewmodel.BaseViewModel;
import com.axiang.lib_common.utils.NetUtil;
import com.axiang.lib_common.utils.RxToast;

import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;

/**
 *
 * @param <T> 传入实体类，需为BaseResponse内部的T
 * @param <VM> 传入当前页的ViewModel
 */
public abstract class CommonObserver<T, VM extends BaseViewModel> implements Observer<BaseResponse<T>> {
    /**
     * 页面viewmode，实现showloading使用
     */
    public VM vm;

    /**
     * 构造方法传入VM
     * @param vm
     */
    public CommonObserver(VM vm){
        this.vm = vm;
    }

    @Override
    public void onSubscribe(@NonNull Disposable d) {
        //没有网络直接返回
        if (!NetUtil.checkNetToast()){
            vm.postShowNetWorkErrViewEvent(true);
            return;
        }
        vm.postShowLoadingDialog(true);
    }

    @Override
    public void onNext(@NonNull BaseResponse<T> tBaseResponse) {
        //做一些回调后需统一处理的事情
        //如请求回来后，先判断token是否失效
        //如果失效则直接跳转登录页面
        //...
        if (tBaseResponse.getErrorCode() == 0) {
            //如果没失效，则正常回调
            onSuccess(tBaseResponse.getData());
        }else {
            //接口报错，返回信息
            onError(tBaseResponse.getErrorCode(), tBaseResponse.getErrorMsg());
        }
    }

    @Override
    public void onComplete() {
        vm.postShowLoadingDialog(false);
    }

    @Override
    public void onError(@NonNull Throwable e) {
        vm.postShowLoadingDialog(false);

        if (e instanceof Exception) {
            //访问获得对应的Exception
            ResponseThrowable responeThrowable = ExceptionHandle.handleException(e);
            onError(responeThrowable.code, responeThrowable.message);
        } else {
            //将Throwable 和 未知错误的status code返回
            ResponseThrowable responeThrowable = new ResponseThrowable(e, ExceptionHandle.ERROR.UNKNOWN);
            onError(responeThrowable.code, responeThrowable.message);
        }
    }

    //具体实现下面两个方法，便可从中得到更直接详细的信息
    public abstract void onSuccess(T t);
    public void onError(int errType, String errMessage){
        //默认弹出错误信息
        RxToast.error(errMessage);
    }
}
